<?php


declare(strict_types=1);

namespace app\eslib;

/**
 * 图片处理助手类
 * @version 1.0.0
 */
class EsImage
{
    // 常用文件大小字节常量
    const SIZE_50KB = 51200;
    const SIZE_200KB = 204800;
    const SIZE_500KB = 512000;
    const SIZE_1MB = 1048576;
    const SIZE_2MB = 2097152;

    const IMAGE_MIME = ['image/gif', 'image/jpg', 'image/jpeg', 'image/bmp', 'image/png', 'image/webp'];
    const IMAGE_EXT = ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'webp'];

    /**
     * 获取图像类型
     * 返回图像常量值(1=gif,2=jpeg,3=png,6=bmp)，否则返回 false。
     */
    public static function getImageType($fileName)
    {
        if (function_exists('exif_imagetype')) {
            // 返回对应的常量，否则返回 FALSE。
            // 详见：https://www.php.net/manual/zh/function.exif-imagetype.php
            return exif_imagetype($fileName);
        }

        try {
            // 获取图像大小及相关信息，成功返回一个数组（宽度、高度、类型常量、宽高属性、颜色位数、通道值、 MIME信息），失败则返回 FALSE 
            // 详见：https://www.php.net/manual/zh/function.getimagesize.php
            // 警告：getimagesize存在上传漏洞。需要额外的条件检查，比如文件大小、扩展名、文件类型，并设置上传目录不允许执行PHP文件。
            $info = getimagesize($fileName);
            return $info ? $info[2] : false;
        } catch (\Exception $e) {
            return false;
        }
    }
    public static function checkImageMime($mimeType)
    {
        return in_array($mimeType, self::IMAGE_MIME);
    }
    public static function checkImageExt($ext)
    {
        return in_array($ext, self::IMAGE_EXT);
    }
    public static function checkWidthAndHeight($fileName, $imgWidth, $imgHeight)
    {
        try {
            // 获取图像大小及相关信息，成功返回一个数组（宽度、高度、类型常量、宽高属性、颜色位数、通道值、 MIME信息），失败则返回 FALSE 
            // 详见：https://www.php.net/manual/zh/function.getimagesize.php
            // 警告：getimagesize存在上传漏洞。需要额外的条件检查，比如文件大小、扩展名、文件类型，并设置上传目录不允许执行PHP文件。
            $imgInfo = getimagesize($fileName);
            DebugHelper::log(compact('imgInfo', 'imgWidth', 'imgHeight'));
            if (!$imgInfo || !isset($imgInfo[2])) {
                return '文件不是有效的图像';
            }
            if (($imgWidth && $imgWidth != $imgInfo[0]) || ($imgHeight && $imgHeight != $imgInfo[1])) {
                return "图片尺寸要求为[宽度={$imgWidth}, 高度={$imgHeight}]，您的图片尺寸[宽度={$imgInfo[0]}, 高度={$imgInfo[1]}]不符合规范 ";
            }
            return true;
        } catch (\Exception $e) {
            return $e->getMessage();
        }
    }
}
